function foo2() {
    console.log('我是foo2')
}
var a = 1




function foo() {
    //里面的可以调用外面的  可以的
    foo2()
    function foo3() {
        console.log('我是foo3')
    }
}
// foo 调用foo 平级调用  常规作用域
// foo2调用外面foo2  里面调用外面的也常规作用域 

foo()
foo3()







//这是闭包吗
// 判断闭包的依据是 是否是常规作用域  如果是常规作用域就肯定不存在闭包 

function foo() {
    var a = 2
    function bar() {
        console.log(a) //2
    }
    bar()
}

foo()





// V8垃圾清理不敢轻易碰闭包函数 
function foo() {
    var a = 2
    function bar() {
        console.log(a)
    }

    return bar
}

var baz = foo()
// baz =  bar 函数 


baz() // 闭包  closure  暂时封闭的独特作用域就叫做闭包 




// 常规作用域
//   平级调用  常规作用域
//   里面调用外面的也常规作用域 


function foo() {
    var a = 2
    function baz() {
        console.log(a)
    }
    bar(baz)
}
function bar(fn) {
    fn() //形成了非常规作用域的函数调用 里面的调用里面的
    // 发生这一句代码的时候形成了一个  closure  暂时封闭的独特作用域就叫做闭包 

  
}

foo()








var fn 
function foo() {
    var a =2 
    function baz() {
        console.log(a)
    }
    fn = baz //将baz 分配给全局变量
}
function bar() {
    fn() //这也能导致闭包 
    //这一句打破了常规作用域
}

foo()

bar()  //2



var a = function() {
    console.log(111)
}


a()